package dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import to.ArquivoAnexo;
import to.Categoria;
import to.Comentarios;
import to.Funcionario;
import to.Mensagem;
import to.Motivo;
import to.Msg_Func_Destino;
import util.HibernateUtil;

public class MensagemDAO {

	public List<Msg_Func_Destino> buscaMensagemInbox(Funcionario f) {

		List<Msg_Func_Destino> listaMensagem = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msr").createAlias("msr.msg", "msg");
			criteria.add(Restrictions.or(
					Restrictions.eq("msg.situacao", "A ser analisada"),
					Restrictions.eq("msg.situacao", "Sendo Analisada")));
			criteria.add(Restrictions.eq("msr.func_destino", f));
			criteria.addOrder(Order.desc("msg.dataSolicitacao"));
			listaMensagem = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaMensagem;
	}

	public List<Msg_Func_Destino> buscaMensagemInboxPorPeridodo(Funcionario f,
			Date dataInicial, Date dataFinal) {

		List<Msg_Func_Destino> listaMensagem = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msr").createAlias("msr.msg", "msg");
			criteria.add(Restrictions.eq("msr.func_destino", f));
			criteria.add(Restrictions.between("msg.dataSolicitacao",
					dataInicial, dataFinal));
			criteria.addOrder(Order.desc("msg.dataSolicitacao"));
			listaMensagem = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaMensagem;
	}

	public List<Msg_Func_Destino> buscaMensagemConcluida(Funcionario f) {

		List<Msg_Func_Destino> listaMensagem = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msr").createAlias("msr.msg", "msg");
			criteria.add(Restrictions.eq("msg.situacao",
					"Solicitacao Concluida"));
			criteria.add(Restrictions.or(
					Restrictions.eq("msr.func_destino", f),
					Restrictions.eq("msr.rementente", f)));
			criteria.addOrder(Order.desc("msg.dataSolicitacao"));
			listaMensagem = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaMensagem;
	}

	public List<Msg_Func_Destino> buscaMensagemSaidaPorPeridodo(Funcionario f,
			Date dataInicial, Date dataFinal) {

		List<Msg_Func_Destino> listaMensagem = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msr").createAlias("msr.msg", "msg");
			criteria.add(Restrictions.eq("msr.rementente", f));
			criteria.add(Restrictions.between("msg.dataSolicitacao",
					dataInicial, dataFinal));
			criteria.addOrder(Order.desc("msg.dataSolicitacao"));
			listaMensagem = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaMensagem;
	}

	public Integer contaMensagemInbox(Funcionario f) {

		Integer total = 0;
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(Msg_Func_Destino.class, "msd")
					.setProjection(Projections.rowCount())
					.createAlias("msd.msg", "msg");
			criteria.add(Restrictions.or(
					Restrictions.eq("msg.situacao", "A ser Analisada"),
					Restrictions.eq("msg.situacao", "Sendo Analisada")));
			criteria.add(Restrictions.like("msg.privacidade", "%Privada%"));
			criteria.add(Restrictions.eq("msd.func_destino", f));

			criteria.add(Restrictions.like("msd.stat_leitura", "%NLida%"));
			total = (Integer) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return total;
	}

	public List<Msg_Func_Destino> buscaMensagemSaida(Funcionario f) {

		List<Msg_Func_Destino> listaMensagem = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msd").createAlias("msd.msg", "msg");
			criteria.add(Restrictions.like("msg.privacidade", "%Privada%"));
			criteria.add(Restrictions.or(
					Restrictions.eq("msg.situacao", "A ser analisada"),
					Restrictions.eq("msg.situacao", "Sendo Analisada")));
			criteria.add(Restrictions.eq("msd.rementente", f));
			criteria.addOrder(Order.desc("msg.dataSolicitacao"));
			listaMensagem = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaMensagem;
	}

	public List<Msg_Func_Destino> buscaAvisosGerais() {

		List<Msg_Func_Destino> listaMensagem = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msd").createAlias("msd.msg", "msg");
			criteria.add(Restrictions.like("msg.privacidade", "%Publica%"));
			criteria.addOrder(Order.desc("msg.dataSolicitacao"));
			listaMensagem = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaMensagem;
	}

	public List<Comentarios> buscaCometariosPorSolicitacao(Mensagem msg) {

		List<Comentarios> listaComentarios = new ArrayList<Comentarios>();
		Session session = null;

		try {
			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Comentarios.class, "c");
			criteria.add(Restrictions.eq("c.mensagem", msg));
			listaComentarios = (List<Comentarios>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaComentarios;
	}

	public Msg_Func_Destino buscaMsgFunc(Mensagem msg) {

		Msg_Func_Destino msd = new Msg_Func_Destino();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"msd").createAlias("msd.msg", "msg");
			criteria.add(Restrictions.eq("msg.id", msg.getId()));
			msd = (Msg_Func_Destino) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return msd;
	}

	public List<Msg_Func_Destino> listaSolicitacaoPorDepartamento(
			Funcionario funcionario) {

		List<Msg_Func_Destino> listaSolicitacoes = new ArrayList<Msg_Func_Destino>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Msg_Func_Destino.class,
					"sol").createAlias("sol.func_destino", "fun");
			criteria.addOrder(Order.asc("sol.id"));

			listaSolicitacoes = (List<Msg_Func_Destino>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();

		}

		return listaSolicitacoes;
	}

	public Motivo buscaMotivo(Integer id) {

		Motivo m = new Motivo();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Motivo.class, "m");
			criteria.add(Restrictions.eq("m.id", id));
			m = (Motivo) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return m;
	}

	public List<Categoria> buscaTodasCategorias() {

		List<Categoria> lista = new ArrayList<Categoria>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Categoria.class, "c");
			criteria.add(Restrictions.eq("c.tipo", "CRM"));
			criteria.addOrder(Order.asc("c.descricao"));
			lista = (List<Categoria>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public List<Motivo> buscaTodosMtivos() {

		List<Motivo> lista = new ArrayList<Motivo>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Motivo.class, "m");
			criteria.add(Restrictions.eq("m.tipo", "CRM"));
			criteria.addOrder(Order.asc("m.descricao"));
			lista = (List<Motivo>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return lista;
	}

	public Categoria buscaCategoriaPorCodigo(Integer id) {

		Categoria c = new Categoria();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session.createCriteria(Categoria.class, "c");
			criteria.add(Restrictions.eq("c.id", id));
			c = (Categoria) criteria.uniqueResult();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return c;

	}

	public List<ArquivoAnexo> listaAnexosMsg(Integer idMsg) {

		List<ArquivoAnexo> listaRetorno = new ArrayList<ArquivoAnexo>();
		Session session = null;

		try {

			session = HibernateUtil.getSessionFactory().openSession();
			Criteria criteria = session
					.createCriteria(ArquivoAnexo.class, "aq").createAlias(
							"aq.msg", "msg");
			criteria.add(Restrictions.eq("msg.id", idMsg));
			listaRetorno = (List<ArquivoAnexo>) criteria.list();

		} catch (Exception e) {
			e.printStackTrace();
		}

		return listaRetorno;
	}

}
